package bebetes;

import java.awt.*;

/**
 * Bébête de type hasard.
 * 
 * Ce type de bébête change aléatoirement de direction et de vitesse après
 * <code>nbTourChgt</code>. De plus elle rebondit sur les bords du champs.
 * 
 * @author COLLET Philippe
 * @author gnpt
 */
public class BebeteHasard extends Bebete {
	/**
	 * Nombre de tours entre chaque changement au hasard de direction et de
	 * vitesse.
	 */
	public static final int nbTourChgt = 30;
	/** Nombre de tours de la bebêtes depuis le précédent. */
	protected int nbTour;

	/**
	 * Constructeur par défaut.
	 * 
	 * @param c
	 *            le champs sur lequel se déplace la bébête.
	 * @param x
	 *            l'abscisse de la bébête sur le champs.
	 * @param y
	 *            l'ordonnée de la bébête sur le champs.
	 * @param dC
	 *            la direction courante de la bébête.
	 * @param vC
	 *            la vitesse courante de la bébête.
	 * @param col
	 *            la couleur associée à la bébête.
	 */
	public BebeteHasard(ChampDeBebetes c, int x, int y, float dC, float vC,
			Color col) {
		super.champ = c;
		super.x = x;
		super.y = y;
		super.directionCourante = dC;
		super.vitesseCourante = vC;
		super.couleur = col;
		this.nbTour = 0;
	}

	@Override
	public void calculeDeplacementAFaire() {
		this.nbTour++;
		this.nbTour %= nbTourChgt;
		/* C'est le moment de changer de direction et de vitesse */
		if (this.nbTour == 0) {
			super.vitesseCourante = super.vitesseCourante
					+ (float) ((Math.random() * 2) - 1);
			if (super.vitesseCourante < 3f) {
				super.vitesseCourante = 3f;
			} else if (super.vitesseCourante > 10f) {
				super.vitesseCourante = 10f;
			}

			super.directionCourante = (float) ((super.directionCourante + ((Math
					.random()
					* Math.PI / 2) - (Math.PI / 4))) % (Math.PI * 2));
			if (super.directionCourante < 0) {
				super.directionCourante += (float) (Math.PI * 2);
			}
		}
	}

	@Override
	public void effectueDeplacement() {
		super.x += (int) (super.vitesseCourante * Math
				.cos((double) super.directionCourante));
		super.y += (int) (super.vitesseCourante * Math
				.sin((double) super.directionCourante));
		if (super.x < 0) {
			super.x = -super.x;
			super.directionCourante = (float) (Math.PI - super.directionCourante)
			% (float) (Math.PI * 2);
		} else if (super.x >= super.champ.getLargeur()) {
			super.x = 2 * super.champ.getLargeur() - super.x - 1;
			super.directionCourante = (float) (Math.PI - super.directionCourante)
					% (float) (Math.PI * 2);
		}
		if (super.y < 0) {
			super.y = -super.y;
			super.directionCourante = (float) (Math.PI * 2 - super.directionCourante)
			% (float) (Math.PI * 2);
		} else if (super.y >= super.champ.getHauteur()) {
			super.y = 2 * super.champ.getHauteur() - super.y - 1;
			super.directionCourante = (float) (Math.PI * 2 - super.directionCourante)
			% (float) (Math.PI * 2);
		}
		if (super.directionCourante < 0) {
			if (super.directionCourante > -1E-4)
				// -1E-4 == 0 !
				super.directionCourante = 0;
			else
				super.directionCourante += (float) (Math.PI * 2);
		}
	}

	/**
	 * Accesseur pour le nombre de tours de la bébête depuis le précédement.
	 * 
	 * @return le nombre de tours de la bébête depuis le précédement.
	 */
	public int getNbTour() {
		return this.nbTour;
	}

	/**
	 * Mutateur pour le nombre de tours de la bébête depuis le précédement.
	 * 
	 * @param nbTour
	 *            le nouveau nombre de tours de la bébête depuis le précédement.
	 */
	public void setNbTour(int nbTour) {
		this.nbTour = nbTour;
	}
}
